package com.preguicoso.client.estabelecimento.carrinho;

import static com.google.gwt.query.client.GQuery.$;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.query.client.Function;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.Cookies;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.HasText;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.InlineLabel;
import com.google.gwt.user.client.ui.Widget;
import com.preguicoso.client.RegistroToken;
import com.preguicoso.client.checkout.Checkout;
import com.preguicoso.client.checkout.CheckoutService;
import com.preguicoso.client.checkout.CheckoutServiceAsync;
import com.preguicoso.client.telaInicial.lightBox;
import com.preguicoso.client.user.StatusPedidoCarrinho;
import com.preguicoso.shared.RegistroStatusPedido;
import com.preguicoso.shared.entities.ItemCardapioBean;
import com.preguicoso.shared.entities.PedidoBean;
import com.preguicoso.shared.utils.MoneyUtils;

public class Carrinho extends Composite  {

	private static CarrinhoUiBinder uiBinder = GWT
			.create(CarrinhoUiBinder.class);
	
	@UiField
	HTMLPanel pedidos;
	@UiField
	HTMLPanel status;
	@UiField
	InlineLabel total;
	@UiField
	Image loading;
	@UiField
	Button pedir;
	@UiField
	Button verCarrinho;
	@UiField
	HTMLPanel deliveryFechado;
	@UiField
	HTMLPanel carrinho;

	interface CarrinhoUiBinder extends UiBinder<Widget, Carrinho> {
	}
	
	private static Carrinho instance = null;
	public static Carrinho getInstance() {
		if (instance == null) {
		
				instance = new Carrinho();
		}
		return instance;
	}
	
	
	ArrayList<ItemCardapioBean> listaItens = new ArrayList<ItemCardapioBean>();

	private Carrinho() {
		initWidget(uiBinder.createAndBindUi(this));
		pedir.setVisible(true);
		status.add(StatusPedidoCarrinho.getInstance());
		
			Timer t = new Timer() {
	
				@Override
				public void run() {
					if (Window.getScrollTop()>359 && Window.getClientWidth()>500) {						
						carrinho.addStyleName("carrinho_fixo");
						if(carCarrinhoClicado){
							carrinho.addStyleName("clique");
							}
					}
					else {
						if(carCarrinhoClicado){
							carrinho.setStyleName("carrinho clique");
							
						}else{
							carrinho.setStyleName("carrinho");
						}
						
					}
				}
			};
			t.scheduleRepeating(100);
			refreshCarrinho();
	}
	
	public void addItem(ItemCardapioBean i){
		listaItens.add(i);
	}
	
	public void removeItem(ItemCardapioBean i){
		listaItens.remove(i);		
	}
	
	public void refreshCarrinho(){
		pedidos.clear();
		for (ItemCardapioBean i : listaItens) {
			pedidos.add(new ItemPedido(i));
		}
		total.setText(MoneyUtils.parseString((long)sumPriceItem()));
		
	}
	/*
	 * Soma dos itens do carrinho
	 */
	public float sumPriceItem(){
		float soma = 0;
		for (ItemCardapioBean i : listaItens) {
			soma +=i.getPreco()*i.getQuantidade();
		}
		return soma;
	}
	
	public void clear(){
		listaItens = new ArrayList<ItemCardapioBean>();
		refreshCarrinho();
	}

	public List<ItemCardapioBean> getListItens() {
		return listaItens;
	}
	
	@UiHandler("pedir")
	void onPedirClick(ClickEvent event) {
		if(Cookies.getCookie("mesa")!=null && Cookies.getCookie("mesaConfirmada")!=null){
			if(Window.confirm("Pedir para a mesa "+Cookies.getCookie("mesa"))){
				pedirMesa(Cookies.getCookie("mesa"));
			}
			else{
				History.newItem(History.getToken()+"/checkout");
				carrinho.setStyleName("carrinho");
				carCarrinhoClicado = false;
				verCarrinho.setText("Ver Pedido");
			}
		}
		else{
			History.newItem(History.getToken()+"/checkout");
			carrinho.setStyleName("carrinho");
			carCarrinhoClicado = false;
		}
	}
	
	boolean carCarrinhoClicado = false;
	@UiHandler("verCarrinho")
	void onVerCarrinhoClick(ClickEvent event) {
		if(carCarrinhoClicado){
			verCarrinho.setText("Ver Pedido");
			carrinho.setStyleName("carrinho");
			pedir.setVisible(true);
			carCarrinhoClicado = false;
		}
		else{
			carrinho.addStyleName("clique");
			verCarrinho.setText("Esconder");
			pedir.setVisible(false);
			carCarrinhoClicado = true;
		}
	}
	
	private final CheckoutServiceAsync checkoutService = GWT
			.create(CheckoutService.class);

	public void pedirMesa(String mesa) {
		PedidoBean p = new PedidoBean();
		if(mesa.equals(""))
		{
			Window.alert("Forneça o número da mesa");
		}
		else
		{
			p.setFormaPagamento(" - ");
			List<ItemCardapioBean> listaItens = Carrinho.getInstance().getListItens();
			// TODO @Osman melhor não ficar dependente do carrinho para determinar o
			// id
			p.setIdEstabelecimento(listaItens.get(0).getEstabelecimentoBean());		
			p.setNomeCliente("Local");
			p.setRua("Mesa "+mesa);
			p.setBairro("No Local");
			p.setTimeStamp(new Date());
			p.setStatus(RegistroStatusPedido.esperando);
			p.setTelefone(" - ");
			p.setListaItens(listaItens);
			p.setEmailUsuario("No Estabelecimento");
			checkoutService.sendPedidos(p,new AsyncCallback<Long>() {
				
				@Override
				public void onSuccess(Long result) {
					Window.alert("Pedido enviado com sucesso!");
					clear();
					StatusPedidoCarrinho.getInstance().setIdPedido(result);
					status.add(StatusPedidoCarrinho.getInstance());	
				}
				
				@Override
				public void onFailure(Throwable caught) {
					caught.printStackTrace();
					lightBox.getInstance().show(new HTMLPanel("Pedido enviado com sucesso!"), 300, 90);
					String token = History.getToken();
					token.replaceAll("/checkout", "");
					History.newItem(token);					
				}
			});
		}
	}
	
}
